package sort;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @Author: yuisama
 * @Date: 2021/9/14 10:56
 * @Description:排序算法的辅助类，用于生成随机数和测试算法性能
 */
public class SortHelper {
    // 随机数生成器
    private static ThreadLocalRandom random = ThreadLocalRandom.current();
    /**
     * 随机生成n个随机数的
     * @param n
     * @param rangeL
     * @param rangeR
     * @return
     */
    public static int[] generateRandomArray(int n,int rangeL,int rangeR) {
        int[] result = new int[n];
        for (int i = 0; i < n; i++) {
            result[i] = random.nextInt(rangeL,rangeR);
        }
        return result;
    }

    /**
     * 测试七大排序在arr数组上排序上的耗时
     * @param sortName 需要测试的算法名称
     * @param arr 指定集合
     */
    public static void testSort(String sortName,int[] arr) throws Exception {
        Class<SevenSortImpl> sevenSortClass = SevenSortImpl.class;
        Method method = sevenSortClass.getMethod(sortName,int[].class);
        long before = System.nanoTime();
        method.invoke(null,arr);
        long after = System.nanoTime();
        if (isSorted(arr)) {
            double allTimes = (after - before) / 1000000.0;
            System.out.println(sortName+"算法共耗时"+allTimes+" ms");
        }
    }

    /**
     * 生成一个近乎有序的数组
     * @param n 要生成的数组大小
     * @param times 交换次数
     * @return
     */
    public static int[] generateSortedArray(int n,int times) {
        int[] ret = new int[n];
        for (int i = 0; i < n; i++) {
            ret[i] = i;
        }
        for (int i = 0; i < times; i++) {
            int a = random.nextInt(n);
            int b = random.nextInt(n);
            int tmp = ret[a];
            ret[a] = ret[b];
            ret[b] = tmp;
        }
        return ret;
    }

    public static boolean isSorted(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                System.err.println("排序算法有误");
                return false;
            }
        }
        return true;
    }

    public static int[] arrayCopy(int[] arr) {
        return Arrays.copyOf(arr,arr.length);
    }
}
